package ar.edu.phm.tpdos.contadorLlamadas;

import java.util.HashMap;
import java.util.Map;

import ar.edu.phm.tpdos.annotations.Monitored;

public aspect ContadorLlamadasAspect {
	private Map<Object, llamadasPorMetodo> metodosContados = new HashMap<Object, llamadasPorMetodo>();

	pointcut metodoMonitoreado(Object target) :
		execution(@Monitored  * *(..))
		 && target(target);
	
	after(Object target): metodoMonitoreado(target) {
		llamadasPorMetodo contadorPorMetodo = obtenerORegistrarContadorPorMetodo(target);
		String nombreMetodo = thisJoinPoint.getSignature().getName();
		contadorPorMetodo.incrementar(nombreMetodo);
	}

	public int cantLlamadas(Object target, String nombreMetodo) {
		return obtenerORegistrarContadorPorMetodo(target).getCantidad(nombreMetodo);
	}

	public llamadasPorMetodo obtenerORegistrarContadorPorMetodo(Object obj) {
		if (!metodosContados.containsKey(obj))
			metodosContados.put(obj, new llamadasPorMetodo());
		return metodosContados.get(obj);
	}
}
